
<!DOCTYPE HTML>
<html lang="zh-hans" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>高阶组件 · React 基础学习资料</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        <meta name="author" content="小翼">
        
        
    
    <link rel="stylesheet" href="../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="07.html" />
    
    
    <link rel="prev" href="05.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="输入并搜索" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../">
            
                <a href="../">
            
                    
                    React 手稿
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../chapter01/00.html">
            
                <a href="../chapter01/00.html">
            
                    
                    基础知识
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1" data-path="../chapter01/01.html">
            
                <a href="../chapter01/01.html">
            
                    
                    初识React
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2" data-path="../chapter01/02.html">
            
                <a href="../chapter01/02.html">
            
                    
                    React 特性
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3" data-path="../chapter01/03.html">
            
                <a href="../chapter01/03.html">
            
                    
                    React Initial Project
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.4" data-path="../chapter01/04.html">
            
                <a href="../chapter01/04.html">
            
                    
                    Component和Dom
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.5" data-path="../chapter01/05.html">
            
                <a href="../chapter01/05.html">
            
                    
                    生态组件
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../chapter02/00.html">
            
                <a href="../chapter02/00.html">
            
                    
                    组件生命周期
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="../chapter02/01.html">
            
                <a href="../chapter02/01.html">
            
                    
                    装载
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="../chapter02/02.html">
            
                <a href="../chapter02/02.html">
            
                    
                    更新
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3" data-path="../chapter02/03.html">
            
                <a href="../chapter02/03.html">
            
                    
                    卸载
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.4" data-path="../chapter02/04.html">
            
                <a href="../chapter02/04.html">
            
                    
                    异常处理
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.5" data-path="../chapter02/05.html">
            
                <a href="../chapter02/05.html">
            
                    
                    React.Component
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="../chapter03/00.html">
            
                <a href="../chapter03/00.html">
            
                    
                    state
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="../chapter03/01.html">
            
                <a href="../chapter03/01.html">
            
                    
                    Component state
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="../chapter03/02.html">
            
                <a href="../chapter03/02.html">
            
                    
                    React-Redux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="../chapter03/03.html">
            
                <a href="../chapter03/03.html">
            
                    
                    React-Router
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.4" data-path="../chapter03/04.html">
            
                <a href="../chapter03/04.html">
            
                    
                    redux-saga
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="../chapter04/00.html">
            
                <a href="../chapter04/00.html">
            
                    
                    组件其他方法
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1" data-path="../chapter04/01.html">
            
                <a href="../chapter04/01.html">
            
                    
                    其他API
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2" data-path="../chapter04/02.html">
            
                <a href="../chapter04/02.html">
            
                    
                    类属性
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.3" data-path="../chapter04/03.html">
            
                <a href="../chapter04/03.html">
            
                    
                    实例属性
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="00.html">
            
                <a href="00.html">
            
                    
                    React 高级用法
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="01.html">
            
                <a href="01.html">
            
                    
                    keys
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="02.html">
            
                <a href="02.html">
            
                    
                    事件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.3" data-path="03.html">
            
                <a href="03.html">
            
                    
                    Refs
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.4" data-path="04.html">
            
                <a href="04.html">
            
                    
                    Fragment
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.5" data-path="05.html">
            
                <a href="05.html">
            
                    
                    Context
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.6.6" data-path="06.html">
            
                <a href="06.html">
            
                    
                    高阶组件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.7" data-path="07.html">
            
                <a href="07.html">
            
                    
                    类型查检
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.8" data-path="08.html">
            
                <a href="08.html">
            
                    
                    代码分隔
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="../chapter06/00.html">
            
                <a href="../chapter06/00.html">
            
                    
                    React 实例
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="../chapter06/01.html">
            
                <a href="../chapter06/01.html">
            
                    
                    List
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.2" data-path="../chapter06/02.html">
            
                <a href="../chapter06/02.html">
            
                    
                    Form
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.3" data-path="../chapter06/03.html">
            
                <a href="../chapter06/03.html">
            
                    
                    Form高级
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.4" data-path="../chapter06/04.html">
            
                <a href="../chapter06/04.html">
            
                    
                    Tooltip
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="../chapter07/00.html">
            
                <a href="../chapter07/00.html">
            
                    
                    React项目打包部署
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.8.1" data-path="../chapter07/01.html">
            
                <a href="../chapter07/01.html">
            
                    
                    与服务端交互
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.2" data-path="../chapter07/02.html">
            
                <a href="../chapter07/02.html">
            
                    
                    打包
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.3" data-path="../chapter07/03.html">
            
                <a href="../chapter07/03.html">
            
                    
                    部署
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="../chapter08/00.html">
            
                <a href="../chapter08/00.html">
            
                    
                    浅谈ES
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.9.1" data-path="../chapter08/01.html">
            
                <a href="../chapter08/01.html">
            
                    
                    ES6 (ES2015)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.2" data-path="../chapter08/02.html">
            
                <a href="../chapter08/02.html">
            
                    
                    ES7 (ES2016)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.3" data-path="../chapter08/03.html">
            
                <a href="../chapter08/03.html">
            
                    
                    ES8 (ES2017)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.4" data-path="../chapter08/04.html">
            
                <a href="../chapter08/04.html">
            
                    
                    ES9 (ES2018)
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.10" data-path="../chapter09/00.html">
            
                <a href="../chapter09/00.html">
            
                    
                    React Hooks
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.10.1" data-path="../chapter09/01.html">
            
                <a href="../chapter09/01.html">
            
                    
                    State Hooks useState
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.2" data-path="../chapter09/02.html">
            
                <a href="../chapter09/02.html">
            
                    
                    State Hooks useReducer
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            本书使用 GitBook 发布
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href=".." >高阶组件</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h1 id="higher-order-components">Higher-Order Components</h1>
<ul>
<li><p>HOC &#x4E0D;&#x662F;React&#x7684;&#x6807;&#x51C6;API&#x3002;</p>
</li>
<li><p>HOC &#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x3002;</p>
</li>
<li><p>HOC &#x8FD4;&#x56DE;&#x4E00;&#x4E2A;<code>Component</code>&#x3002;</p>
<p>&#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code>const EnhancedComponent = higherOrderComponent(WrappedComponent);
</code></pre></li>
</ul>
<h2 id="&#x4F7F;&#x7528;&#x573A;&#x666F;">&#x4F7F;&#x7528;&#x573A;&#x666F;</h2>
<h3 id="&#x4EE3;&#x7801;&#x590D;&#x7528;">&#x4EE3;&#x7801;&#x590D;&#x7528;</h3>
<p>  &#x7C7B;&#x4F3C;React 0.15&#x7248;&#x672C;&#x4E4B;&#x524D;&#x7684;<code>mixin</code>&#x3002;</p>
<p>  &#x591A;&#x4E2A;&#x7EC4;&#x4EF6;&#x540C;&#x7528;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;&#xFF0C;&#x6216;&#x8005;&#x540C;&#x6837;&#x7684;&#x65B9;&#x6CD5;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;HOC&#x3002;</p>
<p>  &#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="lang-jsx">  <span class="hljs-keyword">import</span> React, { PureComponent } <span class="hljs-keyword">from</span> <span class="hljs-string">&apos;react&apos;</span>;

  <span class="hljs-keyword">const</span> Common = (WrapComponent) =&gt; {
    <span class="hljs-keyword">return</span> (
      &lt;div&gt;
        &lt;h1&gt;Title&lt;/h1&gt;
        &lt;WrapComponent /&gt;
      &lt;/div&gt;
    );
  };

  const Header = () =&gt; &lt;div&gt;Header&lt;/div&gt;;
  const Footer = () =&gt; &lt;div&gt;Footer&lt;/div&gt;;

  export default class extends PureComponent {
    render() {
      return (
        &lt;div&gt;
          &lt;div&gt;
            &lt;p&gt;Header Component&lt;/p&gt;
            {Common(Header)}
          &lt;/div&gt;
          &lt;hr /&gt;
          &lt;div&gt;
            &lt;p&gt;Footer Component&lt;/p&gt;
            {Common(Footer)}
          &lt;/div&gt;
        &lt;/div&gt;
      );
    }
  }
</code></pre>
<p>  <a href="https://codesandbox.io/s/myqz6q6ojp" target="_blank">&#x5728;&#x7EBF;&#x793A;&#x4F8B;</a></p>
<h3 id="&#x62BD;&#x8C61;state&#x548C;&#x66F4;&#x6539;props">&#x62BD;&#x8C61;<code>state</code>&#x548C;&#x66F4;&#x6539;<code>props</code></h3>
<p>  &#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>WrappedComponent</code>&#x5305;&#x88F9;&#x7684;&#x7EC4;&#x4EF6;&#x516C;&#x5171;<code>state</code>&#x62BD;&#x8C61;&#x51FA;&#x6765;&#x3002;</p>
<p>  &#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>WrappedComponent</code>&#x5305;&#x88F9;&#x7684;&#x7EC4;&#x4EF6;&#x4F20;&#x9012;&#x4FEE;&#x6539;&#x3001;&#x6DFB;&#x52A0;&#x7B49;&#x7684;<code>props</code>.</p>
<p>  &#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="lang-jsx">  <span class="hljs-keyword">const</span> HOComp = (WrappedComponent) =&gt; {
    <span class="hljs-keyword">return</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
      <span class="hljs-keyword">constructor</span>(props) {
        <span class="hljs-keyword">super</span>(props);
        <span class="hljs-keyword">this</span>.state = {name: <span class="hljs-string">&apos;&apos;</span>};
      }

      componentDidMount() {
        <span class="hljs-keyword">this</span>.setState({name: WrappedComponent.displayName || WrappedComponent.name || <span class="hljs-string">&apos;Component&apos;</span>;});
      }

      <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">WrappedComponent</span> <span class="hljs-attr">name</span>=<span class="hljs-string">{this.state.name}</span> {<span class="hljs-attr">...this.props</span>}/&gt;</span>
    }
  }
</span></code></pre>
<h3 id="&#x6E32;&#x7136;&#x52AB;&#x6301;">&#x6E32;&#x7136;&#x52AB;&#x6301;</h3>
<p>  &#x6761;&#x4EF6;&#x6E32;&#x7136;&#x3002;&#x6839;&#x636E;<code>props</code>&#x6216;&#x8005;<code>state</code>&#x6761;&#x4EF6;&#x8FD4;&#x56DE;&#x5728;&#x6E32;&#x7136;&#x7684;&#x5185;&#x5BB9;&#x3002;</p>
<p>  &#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="lang-jsx">  <span class="hljs-keyword">const</span> HOComp = (WrappedComponent) =&gt; {
    <span class="hljs-keyword">return</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Enhancer</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">WrappedComponent</span> </span>{
      render() {
        <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.props.loggedIn) {
          <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.render()
        } <span class="hljs-keyword">else</span> {
          <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>
        }
      }
    }
  }
</code></pre>
<h3 id="&#x53CD;&#x5411;&#x7EE7;&#x627F;">&#x53CD;&#x5411;&#x7EE7;&#x627F;</h3>
<p>  &#x8FD4;&#x56DE;&#x7684;&#x9AD8;&#x9636;&#x7EC4;&#x4EF6;&#x7C7B;&#xFF08;<code>Enhancer</code>&#xFF09;&#x7EE7;&#x627F;&#x4E86; <code>WrappedComponent</code>&#x3002;</p>
<p>  &#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="lang-jsx">  <span class="hljs-keyword">const</span> EnchanceComponent = (WrappedCompopnent) =&gt; {
    <span class="hljs-keyword">return</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">WrappedCompopnent</span> </span>{
      <span class="hljs-keyword">constructor</span>(props) {
        <span class="hljs-keyword">super</span>(props);
        <span class="hljs-keyword">this</span>.state = { error: <span class="hljs-string">&apos;&apos;</span> };
      }
      componentDidMount() {
        <span class="hljs-comment">/*do something*/</span>
        <span class="hljs-keyword">super</span>.componentDidMount();
      }
      render() {
        <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.state.error) {
          <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>{this.state.error}<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>;
        } <span class="hljs-keyword">else</span> {
          <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.render();
        }
      }
    }
  };
</code></pre>
<p>  <a href="https://codesandbox.io/s/qkx9qmlpzq" target="_blank">&#x5728;&#x7EBF;&#x793A;&#x4F8B;</a></p>

                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="05.html" class="navigation navigation-prev " aria-label="Previous page: Context">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="07.html" class="navigation navigation-next " aria-label="Next page: 类型查检">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"高阶组件","level":"1.6.6","depth":2,"next":{"title":"类型查检","level":"1.6.7","depth":2,"path":"chapter05/07.md","ref":"./chapter05/07.md","articles":[]},"previous":{"title":"Context","level":"1.6.5","depth":2,"path":"chapter05/05.md","ref":"./chapter05/05.md","articles":[]},"dir":"ltr"},"config":{"plugins":[],"root":"./books","styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"小翼","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"React 基础学习资料","language":"zh-hans","links":{"gitbook":false,"sharing":{"google":true,"facebook":true,"twitter":true}},"gitbook":"*"},"file":{"path":"chapter05/06.md","mtime":"2020-03-07T07:33:43.863Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-03-09T08:08:41.080Z"},"basePath":"..","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="../gitbook/gitbook.js"></script>
    <script src="../gitbook/theme.js"></script>
    
        
        <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

